import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;


public class CalculClient {

	public static void main(String[] args) {
		int nbrePross = 0;
		String ligne = "";
		String colonne = "";
		long time = System.currentTimeMillis();
		String[] tableauNom = {"truite"};
		try{

			InfoInterface lol = (InfoInterface) Naming.lookup("//" + tableauNom[0] + ".polytechnique.fr:1143/Info");
			nbrePross = lol.getNbrePross();
			ligne = lol.getLigne();
			colonne = lol.getColonne();
		}
		catch (NotBoundException e){
			System.out.println ("\"//marne.polytechnique.fr/Info\" does not exist");
		} catch (MalformedURLException e) {
			System.out.println ("\"//marne.polytechnique.fr/Info\" not a valid URL ");
		} catch (RemoteException e) {
			System.out.println ("Some remote exception in lookup"+e);
		}
		CalculInterfaceMieux[] mesPross = new CalculInterfaceMieux[nbrePross * tableauNom.length];
		try{
			for(int i = 0; i < tableauNom.length; i++)
			for(int k = 0; k<nbrePross; k++)
			{
				mesPross[i*nbrePross + k] = (CalculInterfaceMieux) Naming.lookup("//" + tableauNom[i] + ".polytechnique.fr:1143/Calcul" + (k+1));
				System.out.println("Le serveur " + (k+1)+ "sur " + tableauNom[i] + " est OK!");
			}
		}
		catch (NotBoundException e){
			System.out.println ("\"//marne.polytechnique.fr/Info\" does not exist");
		} catch (MalformedURLException e) {
			System.out.println ("\"//marne.polytechnique.fr/Info\" not a valid URL ");
		} catch (RemoteException e) {
			System.out.println ("Some remote exception in lookup"+e);
		}

		try{
			int[] monTableauAncien = {1,0,1};
			int[] monTableauNouveau;
			int[][] Resultats;
			//etape 1: nbre d etapes < plus petite taille 
			for(int etapes = 2; etapes < colonne.length(); etapes++)
			{
				monTableauNouveau = new int[1+2*etapes];
				monTableauNouveau[0] = etapes;
				monTableauNouveau[2*etapes] = etapes;

				for(int k = 0; k < 1+2*(etapes-1); k++)
				{
					if(k % 2 == 0)
						monTableauNouveau[1+k] = monTableauAncien[k];
				}

				Resultats = new int[nbrePross][];

				for(int k = 0; k < nbrePross; k++)
				{
					Resultats[k] = mesPross[k].calcul(monTableauAncien, etapes);
				}

				for(int i = 2; i < 2*etapes; i++)
				{
					if(i % 2 == 0)
					{
						monTableauNouveau[i] = Resultats[(i/2 -1) % nbrePross][(i/2 -1)/nbrePross];
					}
				}
				monTableauAncien = (int[]) monTableauNouveau.clone();

			}
			//etape 2
			System.out.println("etape 2");
			for(int etapes = colonne.length(); etapes < ligne.length(); etapes++)
			{
				monTableauNouveau = new int[monTableauAncien.length];
				monTableauNouveau[monTableauAncien.length -1] = etapes;

				for(int k = 0; k < monTableauAncien.length -1; k++)
				{
					if(k % 2 == 0)
					{
						monTableauNouveau[1+k] = monTableauAncien[2+k];
					}
				}
				Resultats = new int[nbrePross][];


				for(int k = 0; k < nbrePross; k++)
				{
					Resultats[k] = mesPross[k].calcul(monTableauAncien, etapes);
				}
				monTableauNouveau[0] = Resultats[0][0];
				for(int i = 2; i <monTableauAncien.length-1 ; i++)
				{
					if(i % 2 == 0)
						monTableauNouveau[i] = Resultats[(i/2) % nbrePross][(i/2 -1)/nbrePross];

				}

				monTableauAncien = (int[]) monTableauNouveau.clone();

			}

			//etape 3
			System.out.println("etape 3");
			for(int etapes = ligne.length(); etapes < ligne.length() + colonne.length() -1; etapes++)
			{
				monTableauNouveau = new int[monTableauAncien.length -2];

				for(int k = 0; k < monTableauNouveau.length - 1 ; k++)
				{
					if(k % 2 == 0)
					{
						monTableauNouveau[1+k] = monTableauAncien[2+k];
					}
				}
				Resultats = new int[nbrePross][];

				for(int k = 0; k < nbrePross; k++)
				{
					Resultats[k] = mesPross[k].calcul(monTableauAncien, etapes);
				}
				monTableauNouveau[0] = Resultats[0][0];

				for(int i = 2; i < monTableauNouveau.length; i++)
				{
					if(i % 2 == 0)
						monTableauNouveau[i] = Resultats[(i/2) % nbrePross][(i/2 -1)/nbrePross];
				}
				monTableauAncien = (int[]) monTableauNouveau.clone();

			}
			time = System.currentTimeMillis() -time;
			System.out.println("Temps d'execution :"+time);
			System.out.println(monTableauAncien[0] + " est la distance entre les 2 chaines.");

		}
		catch (RemoteException e) { 
			System.out.println ("Some remote exception for hello.say()"+e);
		}
	}

}
